#ifndef __drv_l1_SYSTEM_H__
#define __drv_l1_SYSTEM_H__

#include "driver_l1.h"
#include "drv_l1_sfr.h"

typedef enum
{
	PWR_KEY0,
	PWR_KEY1,
	PWR_KEY2,
	PWR_KEY3
} PWR_KEY;

typedef enum
{
	LDO_XCK_3v0 = 0x0,
	LDO_XCK_3v1 = 0x1,
	LDO_XCK_2v9 = 0x2,
	LDO_XCK_2v8 = 0x3,
	LDO_XCK_DEF = LDO_XCK_3v0
} LDO_XCK_VOLT;

typedef enum
{
	LDO_XCK_EN_OFF	= 0x0,
	LDO_XCK_EN_ON	= 0x1,
	LDO_XCK_EN_DEF	= LDO_XCK_EN_ON
} LDO_XCK_EN;

typedef enum
{
	LDO_DDR_1v8 = 0x0,
	LDO_DDR_1v9 = 0x1,
	LDO_DDR_2v0 = 0x2,
	LDO_DDR_2v1 = 0x3,
	LDO_DDR_2v2 = 0x4,
	LDO_DDR_2v3 = 0x5,
	LDO_DDR_2v4 = 0x6,
	LDO_DDR_2v5 = 0x7,
	LDO_DDR_DEF = LDO_DDR_2v2
} LDO_DDR_VOLT;

typedef enum
{
	LDO_DDR_EN_OFF	= 0x0,
	LDO_DDR_EN_ON	= 0x1,
	LDO_DDR_EN_DEF	= LDO_DDR_EN_ON
} LDO_DDR_EN;

typedef enum
{
	LDO_28_2v8		= 0x0,
	LDO_28_2v9		= 0x1,
	LDO_28_3v0		= 0x2,
	LDO_28_1v5		= 0x3,
	LDO_28_1v8		= 0x4,
	LDO_28_2v5		= 0x5,
	LDO_28_2v6		= 0x6,
	LDO_28_2v7		= 0x7
} LDO_28_VOLT;

typedef enum
{
	LDO_28_EN_OFF	= 0x0,
	LDO_28_EN_ON	= 0x1
} LDO_28_EN;

typedef enum
{
	LDO_18_2v8		= 0x0,
	LDO_18_2v9		= 0x1,
	LDO_18_3v0		= 0x2,
	LDO_18_1v5		= 0x3,
	LDO_18_1v8		= 0x4,
	LDO_18_2v5		= 0x5,
	LDO_18_2v6		= 0x6,
	LDO_18_2v7		= 0x7,
	LDO_18_DEF		= LDO_18_3v0
} LDO_18_VOLT;

typedef enum
{
	LDO_18_EN_OFF	= 0x0,
	LDO_18_EN_ON	= 0x1,
	LDO_18_PULL_LOW	= 0x2,
	LDO_18_EN_DEF	= LDO_18_EN_OFF
} LDO_18_EN;

typedef enum
{
	LDO_12_HALV_EN_OFF	= 0x0,
	LDO_12_HALV_EN_ON	= 0x1,
	LDO_12_HALV_EN_DEF	= LDO_12_HALV_EN_ON
} LDO_12_HALV_EN;

typedef enum
{
	LDO_12_HALV_1v35	= 0x0,
	LDO_12_HALV_1v2		= 0x1,
	LDO_12_HALV_1v3		= 0x2,
	LDO_12_HALV_1v4		= 0x3,
	LDO_12_HALV_1v37	= 0x4,
	LDO_12_HALV_0v9		= 0x5,
	LDO_12_HALV_0v8		= 0x6,
	LDO_12_HALV_0v7		= 0x7,
	LDO_12_HALV_DEF		= LDO_12_HALV_0v9
} LDO_12_HALV;

typedef enum
{
	LDO_12_1v333		= 0x0,
	LDO_12_1v2			= 0x1,
	LDO_12_1v3			= 0x2,
	LDO_12_1v4			= 0x3,
	LDO_12_1v366		= 0x4,
	LDO_12_1v266		= 0x5,
	LDO_12_1v233		= 0x6,
	LDO_12_0v9			= 0x7,
	LDO_12_DEF			= LDO_12_1v3
} LDO_12_VOLT;


typedef enum
{
	LDO_12_OFF		= 0x0,
	LDO_12_ON		= 0x1
} LDO_33_12_EN;

typedef enum
{
	SYS_LVR_2v8			= 0x0,
	SYS_LVR_2v5			= 0x1,
	SYS_LVR_2v3			= 0x2,
	SYS_LVR_2v0			= 0x3,
	SYS_LVR_DEF			= SYS_LVR_2v8
} SYS_LVR_VOLT;

typedef enum
{
	SYS_CHR_25ma = 0x0,
	SYS_CHR_50ma = 0x1,
	SYS_CHR_75ma = 0x2,
	SYS_CHR_100ma = 0x3,
	SYS_CHR_125ma = 0x4,
	SYS_CHR_150ma = 0x5,
	SYS_CHR_175ma = 0x6,
	SYS_CHR_200ma = 0x7,
	SYS_CHR_A_DEF = SYS_CHR_100ma
} SYS_CHR_AMPERE;

typedef enum
{
	SYS_CHR_EN_OFF	= 0x0,
	SYS_CHR_EN_ON	= 0x1,
	SYS_CHR_EN_DEF	= SYS_CHR_EN_OFF
} SYS_CHR_EN;

typedef enum
{
	SYS_WDT_2T0_SEC		= 0x0,
	SYS_WDT_1T0_SEC		= 0x1,
	SYS_WDT_0T5_SEC		= 0x2,
	SYS_WDT_0T25_SEC	= 0x3,
	SYS_WDT_4T0_SEC		= 0x4,
	SYS_WDT_8T0_SEC		= 0x5,
	SYS_WDT_16T0_SEC	= 0x6,
	SYS_WDT_0T125_SEC	= 0x7,
	SYS_WDT_DEF			= SYS_WDT_2T0_SEC
} SYS_WDT_PERIOD;

typedef enum
{
	SYS_WDT_EN_OFF	= 0x0,
	SYS_WDT_EN_ON	= 0x1,
	SYS_WDT_EN_DEF	= SYS_WDT_EN_OFF
} SYS_WDT_EN;

#define LDO_CODEC_3v0	0x000
#define LDO_CODEC_3v1	0x200
#define LDO_CODEC_2v9	0x400
#define LDO_CODEC_2v8	0x600

extern INT32U SYS_CLK;

extern void		drv_l1_sys_power_handler(void);
extern void		drv_l1_sys_enter_halt_mode(void);

extern void		drv_l1_sys_ldo_12_halv_ctrl(LDO_12_HALV_EN en, LDO_12_HALV halv);
extern void		drv_l1_sys_ldo_12_en(LDO_33_12_EN en);
extern INT32S	drv_l1_sys_ldo_codec_ctrl(int flag, int mode);

extern INT32U	drv_l1_sys_pwr_key_read(PWR_KEY pwr_key);

extern void 	drv_l1_sys_lvr_set(SYS_LVR_VOLT mode);
extern void		drv_l1_sys_chr_set(SYS_CHR_EN en, SYS_CHR_AMPERE chr_amp);
extern INT8U	drv_l1_sys_chr_get_status(void);
extern void		drv_l1_sys_wdt_enable_set(SYS_WDT_EN en);
extern void		drv_l1_sys_wdt_period_set(SYS_WDT_PERIOD mode);
extern void		drv_l1_sys_wdt_clear(void);
extern SYS_WDT_EN drv_l1_sys_wdt_enable_get(void);
extern SYS_WDT_PERIOD drv_l1_sys_wdt_period_get(void);

extern void		drv_l1_sys_extosc_set(INT8U en);
extern INT8U	drv_l1_sys_extosc_get(void);

extern void		drv_l1_sys_init(void);
extern INT32U	drv_l1_sys_clock_get(void);

extern void		drv_l1_sys_ldo_xck_ctrl(LDO_DDR_EN en, LDO_DDR_VOLT mode);
extern void		drv_l1_sys_ldo_ddr_ctrl(LDO_DDR_EN en, LDO_DDR_VOLT mode);
extern void		drv_l1_sys_ldo_28_ctrl(LDO_28_EN en, LDO_28_VOLT mode);
extern void		drv_l1_sys_ldo_18_ctrl(LDO_18_EN en, LDO_18_VOLT mode);
extern void		drv_l1_sys_ldo_12_set(LDO_12_VOLT mode);
extern LDO_12_VOLT	drv_l1_sys_ldo_12_get(void);

extern INT8U	drv_l1_sys_chr_get_status_method(INT8U method);

#endif // __drv_l1_SYSTEM_H__
